package com.cn.common.core.codc;

import com.cn.common.core.model.Response;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;

import java.io.IOException;
import java.util.List;

/**
 * <pre>
 * 数据包格式
 * +——----——+——-----——+——----——+——----——+——----——+——----——+
 * |  包头	|  模块号      |  命令号    |  结果码    |  长度       |   数据     |  
 * +——----——+——-----——+——----——+——----——+——----——+——----——+
 * </pre>
 * @author -Sunjingke-
 *
 */
public class ResponseDecoderExtLenField extends LengthFieldBasedFrameDecoder {
	
	/**
	 * 数据包基本长度
	 */
	public static int BASE_LENTH = 4 + 2 + 2 + 4 + 4;
	public ResponseDecoderExtLenField(int maxFrameLength, int lengthFieldOffset,
									 int lengthFieldLength) throws IOException {

		super(maxFrameLength, lengthFieldOffset, lengthFieldLength);

	}
	@Override
	protected Object decode(ChannelHandlerContext ctx,ByteBuf in) throws Exception {
		ByteBuf frame = (ByteBuf) super.decode(ctx, in);
		//如果为空则说明是一个半包消息，直接返回继续有I/O线程读取后续的码流
		if (frame == null) {
			return null;
		}
		Response response = new Response();
		int fixedHeader=frame.readInt();//这个头没有作用，被抛弃掉，不放入到response中

				//读取模块号命令号
		short module = frame.readShort();
		short cmd = frame.readShort();
		int stateCode = frame.readInt();
				//读取数据长度
		int lenth = frame.readInt();
		//读数据部分
		byte[] data = new byte[lenth];
		frame.readBytes(data);

		response.setModule(module);
		response.setCmd(cmd);
		response.setStateCode(stateCode);
		response.setData(data);
		//解析出消息对象，继续往下面的handler传递

		return response;
	}

}
